package matse11.project;

import java.util.ArrayList;
import java.util.Random;
/**
 * @author b.osterholt
 *
 * In der SPIELRUNDE spielt man eine Runde BlackJack.
 * @einsatz Einsatz des Spielers fuer diese Runde. 
 */
public class Spielrunde {
	public int einsatz = 0;
	private Spiel spiel;

	public Spielrunde(Spiel s) {
		spiel = s;
	}
	
	/**
	 * Fordert den Einsatz vom Spieler an, speichert diesen 
	 * (anstatt setEinsatz(int e) )
	 * und ueberprueft ob das Guthaben ausreichend ist.
	 * Ausserdem wird der Einsatz vom Guthaben abgezogen.
	 * 
	 * @param Einsatz 
	 */
	public void einsatzAnfordern(Spieler s, int e) {

		if ((e>0) && (s.getGuthaben()-e >=0)) 
			einsatz = e;
		else if (s.getGuthaben() >= 5)
			einsatz = 5;
		
		else einsatz = s.getGuthaben();
		
		s.addiereGuthaben(-einsatz);
	}
	
	/**
	 * Ruft austeilen() und auswerten() auf und laueft so lange, 
	 * bis ein Mitspieler gewonnen hat.
	 */
	public void spielen() {
//		/** Spieler ist an der Reihe **/
//		Spieler spieler = ((Spieler) spiel.mitspieler.get(1));
//		Karte neu = austeilen();
//		spiel.ausgeteilt.add(spiel.karten.indexOf(neu));
//		spieler.handkarten.add(neu);
//		boolean weitereKarte = true;
//		
//		while (weitereKarte) {
//			neu = austeilen();
//			spiel.ausgeteilt.add(spiel.karten.indexOf(neu));
//			spieler.handkarten.add(neu);
//			spieler.punkte=punkteBestimmen(spieler);
//			boolean eingabe; 
////Methode aufrufen, ob Spieler weitere Karte haben moechte naechsterZug
////			if (!spieler.naechsterZug(eingabe))
//				weitereKarte = false;			
//		}
//		
//		/** Dealer ist an der Reihe **/
//		Dealer dealer = ((Dealer) spiel.mitspieler.get(0));
//		neu = austeilen();
//		spiel.ausgeteilt.add(spiel.karten.indexOf(neu));
//		dealer.handkarten.add(neu);
//		weitereKarte = true;
//		
//		while (weitereKarte) {
//			neu = austeilen();
//			spiel.ausgeteilt.add(spiel.karten.indexOf(neu));
//			dealer.handkarten.add(neu);
//			dealer.punkte=punkteBestimmen(dealer);
//			if (!dealer.naechsterZug())
//				weitereKarte = false;			
//		}
		
		int ergebnis = auswerten((Dealer) spiel.mitspieler.get(0), (Spieler) spiel.mitspieler.get(1));
		switch (ergebnis) {
		//Methode aufrufen, die ausgibt, dass Spieler gewonnen, etc hat
		case 1: break;
		case 0: break;
		case -1: break;
		}
	}

	/**
	 * Methode bestimmt die aktuelle Punktzahl des Mitspielers
	 * @return aktuelle Punktzahl
	 */
	public int punkteBestimmen(Mitspieler m){
		int punkte=0;
		for (int i=0; i< m.handkarten.size();i++){
			punkte+=m.handkarten.get(i).getWert();
		}
		
		for (int i=0; i<= m.handkarten.size();i++){
			while (punkte>21) 
				if (m.handkarten.get(i).getWert() == 11)
					punkte+=1-11;	//Ass zaehlt als eins.
			}
		return punkte;
	}
	
	/**
	 * mit Random wird eine Karte gezogen, prueft, ob sie ausgeteilt werden kann
	 * @return gezogene Karte
	 */		
	public Karte austeilen() {

		boolean bereitsAusgeteilt = true;
		Karte neu=null;
		Random r= new Random();
		int kartenindex;
		
		if (spiel.ausgeteilt == null) {
			double random = r.nextDouble();
			kartenindex = (int) (random *6*52); 	//6*52 Karten
			neu = spiel.karten.get(kartenindex);
			return neu;
		}
		
		while (bereitsAusgeteilt){
			double random = r.nextDouble();
			kartenindex = (int) (random *6*52)-1; 	//6*52 Karten
			System.out.println("@@@@@@@@@@@@" + spiel.karten.size());
			if (!spiel.ausgeteilt.contains(spiel.karten.get(kartenindex))) {
				bereitsAusgeteilt=false;
				neu = spiel.karten.get(kartenindex);
				return neu;
			}
		}
		return neu;
	}
	
	/**
	 * @return Gibt zurueck, ob der Spieler gewonnen oder verloren hat
	 * 		Gewonnen = 1 (Spieler) 
	 * 		Gleichstand = 0
	 * 		Verloren = -1 (Spieler, Dealer gewonnen)
	 * 
	 * ausserdem testen, wie gewonnen wurde (Strategie)
	 * und Gewinn austeilen ans Spielerguthaben
	 */
	public int auswerten(Dealer d, Spieler s) {
		int punkteS = s.punkte;
		int punkteD = d.punkte;
		
		if (punkteS >21)
			return -1;	//Sobald Spieler>21Punkte, hat Dealer gewonnen
		
		if (spiel.ausgeteilt.size() == 3) // Siebenerdrilling
			if ((((Karte) spiel.karten.get(spiel.ausgeteilt.get(0))).getWert() == 7) &&
				(((Karte) spiel.karten.get(spiel.ausgeteilt.get(1))).getWert() == 7) &&
				(((Karte) spiel.karten.get(spiel.ausgeteilt.get(2))).getWert() == 7)) {
				s.addiereGuthaben((int) Math.round(einsatz*2.5+0.5));
				return 1;
			}
		if (blackJack(s))		   //Black Jack
			if (blackJack(d)) {
				s.addiereGuthaben(einsatz);
				return 0;
			}
			else {s.addiereGuthaben((int) Math.round(einsatz*2.5+0.5));
			return 1; }
				
		
		if  (spiel.ausgeteilt.size() == 5) // Fuenferkartentrick
			if (blackJack(d)) //blackJack des Dealers zaehlt mehr
				return -1;
			else {
				s.addiereGuthaben(einsatz*2);
				return 1;
			}
		
		if ((punkteS > punkteD) || (punkteD > 21)) //Spieler gewonnen  
		{	s.addiereGuthaben(einsatz*2);
			return 1;
		}
		
		if (punkteS < punkteD) //Dealer gewonnen
			return -1;
		
		//Gleichstand
		s.addiereGuthaben(einsatz);		
		return 0;
	}
	
	/**
	 * Methode ueberprueft, ob der Spieler einen BlackJack hat
	 * 
	 * @param handkarten	eigene gezogene Karten (ausgeteilt)
	 * @return Hat der Mitspieler einen Black Jack oder nicht
	 */
	private boolean blackJack(Mitspieler m){
		if (m.handkarten.size() == 2)
			if (m.punkte == 21)
				return true;
		
		return false; 
	}
}
